package com.example.myDesignPatterns.创建者模式.单例模式.依然存在的问题;


import java.io.Serializable;

/**
 * SingletonPerfect 实现了单例模式，并通过静态内部类方式保证了线程安全和懒加载。
 * 同时，通过重写 readResolve 方法防止了序列化和反序列化破坏单例。
 */
public class SingletonPerfect implements Serializable {
    private static final long serialVersionUID = -76597547766198971L; // 序列化版本号
    // 私有构造方法，确保外部不能直接实例化
    private SingletonPerfect() {
         /*
           反射破解单例模式需要添加的代码
        */
        if (SingletonHolder.INSTANCE != null) {
            throw new RuntimeException();
        }
    }
    // 静态内部类，用于延迟初始化单例实例
    private static class SingletonHolder {
        private static final SingletonPerfect INSTANCE = new SingletonPerfect();
    }
    // 获取单例实例的公共方法
    public static SingletonPerfect getInstance() {
        return SingletonHolder.INSTANCE;
    }
    // 保护单例不被序列化和反序列化破坏
    private Object readResolve() {
        // 反序列化时返回 SingletonHolder 中的单例实例
        return SingletonHolder.INSTANCE;
    }
}

class SingletonPerfect5 implements Serializable {
    private static final long serialVersionUID = -76597547766198971L; // 序列化版本号
    // 私有构造方法，确保外部不能直接实例化
    private SingletonPerfect5() {
         /*
           反射破解单例模式需要添加的代码
        */
        if (instance != null) {
            throw new RuntimeException();
        }
    }
    private static volatile SingletonPerfect5 instance;
    public static SingletonPerfect5 getInstance(){
        //第一次判断，如果instance不为null，不进入抢锁阶段，直接返回实例
        if(instance == null){
            synchronized (SingletonPerfect5.class){
                //抢到锁之后再次判断是否为null
                if(instance == null){
                    instance = new SingletonPerfect5();
                }
            }
        }
        return instance;
    }
}